// @author: caoshi
// @date: 2021-05-03 21:11
// 单向通道
// 单向通道一般用于函数的参数位置
/**
对于定向通道, 一般是定义一个双向通道, 然后在函数的参数位置进行限制只读或只写

func fun1(ch <- chan int) {...}		只读
func fun2(ch chan <- int) {...}     只写
*/
package main

import "fmt"

func main() {
	/**
	单向: 定向
	chan <- T	只支持写
	<- chan T 	只支持读
	*/
	ch1 := make(chan int)
	//ch2 := make(chan <- int)		// 单向, 只可写,不可读
	//ch3 := make(<- chan int)		// 单向, 只可读,不可写

	//ch1 <- 100
	//data := <- ch1
	//fmt.Println("data = ", data)

	//ch2 <- 100
	//data := <- ch2			// 非法操作
	// data2 := <- ch3		可以读
	//ch3 <- 200	// 非法操作, 不可写入数据

	//go fun1(ch1)
	//data := <- ch1
	//fmt.Println("fun1函数中写出的数据是: ", data)

	go fun2(ch1)
	ch1 <- 200
	fmt.Println("main over ..")

}

// 该函数, 只能操作只写的通道
func fun1(ch chan<- int) {
	// 在函数内部, 对于ch1通道(双向通道), 只能写数据不可读数据
	ch <- 100
	fmt.Println("fun1 over")
}

// 该函数, 只能操作只读的通道
func fun2(ch <-chan int) {
	data := <-ch // 读取数据
	fmt.Println("fun2函数中读取的数据是: ", data)
}
